<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <title>Enteros Largos</title>
  <meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" />
</head>

<body>
<h1>Enteros Largos</h1>

<h2>Introducción</h2>

<p>Supongamos que queremos realizar operaciones matemáticas entre números
enteros, y a su vez el resultado de la misma no puede ser almacenado en ningún
tipo de dato que brinde el lenguaje de programación.</p>

<p>Por ejemplo, si realizamos la siguiente operación:</p>

<p>2<sup>100</sup> = 1267650600228229401496703205376</p>

<p>observamos que el resultado es un número que excede los 30 dígitos y por
ende no se lo puede representar en un tipo de dato primitivo, salvo lenguajes
como python que ya brindan soporte nativo para números largos (realmente
largos, tanto como la memoria de su máquina lo permita) <span
style="background-color:#ffa500">VER si queda como nota al pie</span>.</p>

<p>La solución consiste en definir un nuevo tipo de dato que pueda almacenar
tales números y que además proporcione las operaciones básicas que
necesitemos, para lo cual tenemos que buscar un diseño que simplifique tanto
la representación del número como también las operaciones que vamos a
realizar sobre él. Además, hay otros factores que influyen:</p>
<ul>
  <li>Si va a modificarse dinámicamente o simplemente se lo va a utilizar para
    operar sobre otro número. <span style="background-color:#ffa500">ACLARAR
    MEJOR</span></li>
</ul>
<ul>
  <li>Si es demasiado grande puede traer problemas para representarlo en
    memoria.</li>
</ul>
<ul>
  <li>Si queremos optimizar una operación en particular, probablemente una
    representación sea más conveniente que otra.</li>
</ul>

<p>Teniendo en cuenta estos factores, veamos como se puede representar un
número largo y analicemos para cada caso sus ventajas y desventajas.</p>

<p></p>

<p><strong>EnteroLargo1</strong></p>

<p style="margin-left:2em;"><strong>tam</strong>: entero</p>

<p style="margin-left:2em;"><strong>num[n]</strong>: arreglo estático o
dinámico <span style="background-color:#ffa500">VER SI HABLAMOS DE DINÁMICO
YA QUE NO LO USAMOS Y MUY PROBABLEMENTE NUNCA CONVENGA</span></p>

<p></p>

<p>El tipo de datos <strong>EnteroLargo1</strong> tiene un atributo
<strong>tam</strong> que representa la cantidad de elementos que tiene el
número y un vector <strong>num</strong> donde cada elemento representa un
dígito del número.</p>

<p>Cabe aclarar que <strong>num</strong> puede ser estático o dinámico. En la
primer opción la longitud es fija y se conoce de antemano, en este caso todos
los dígitos pueden estar almacenados justificados a la izquierda o a la
derecha dentro del arreglo, y en la segunda el arreglo crece cuando es
necesario. Se recomienda utilizar el arreglo estático, ya que en general
simplifica la implementación y además permite reemplazar <strong>tam</strong>
por otro atributo que representa el índice del primer dígito significativo
del número (cuando el número está justificado a la derecha), lo que permite
implementar las operaciones de forma más natural.</p>

<p></p>

<p><strong>EnteroLargo2</strong></p>

<p style="margin-left:2em;"><strong>desp</strong>: entero</p>

<p style="margin-left:2em;"><strong>num[n]</strong>: arreglo estático</p>

<p></p>

<p>Otra representación posible es mediante una lista en donde cada elemento de
la lista representa un dígito del número. </p>

<p></p>

<p><strong>EnteroLargo3</strong></p>

<p style="margin-left:2em;"><strong>tam</strong>: entero</p>

<p style="margin-left:2em;"><strong>num</strong>: lista de elementos</p>

<p></p>

<h2>Ejemplo gráfico de cada representación</h2>

<p>Un grafiquito que muestre cada una de las tres opciones de implementación
de la estructura de datos.</p>

<h2>Ventajas y desventajas </h2>

<p>Ventajas y desventajas de cada una de las estructuras propuestas
anteriormente.</p>

<h1>Operaciones básicas</h1>

<p>Proponemos para las siguientes operaciones la estructura de datos con el
arreglo de dígitos estático (<strong>EnteroLargo2</strong>). <span
style="background-color:#ffff00">(<span style="color:#0021ff"><span
style="color:#000000">Ampliar</span></span>)</span></p>

<p></p>

<p><span style="background-color:#ffff00">Probar el tema de los signos para
todas las operaciones <span style="background-color:#ffff00">(artilugios
posibles)</span></span></p>

<h2>Adición</h2>

<p>Se explica el algoritmo de la suma con su respectivo pseudocódigo.</p>

<p>ADICIÓN(<span style="background-color:#ffff00">ref</span> a,<span
style="background-color:#ffff00">ref</span> b,<span
style="background-color:#ffff00">ref</span> r):</p>

<p style="margin-left:2em;">acarreo = 0</p>

<p style="margin-left:2em;">tam = MAX - MAXIMO(a.tam, b.tam)-2</p>

<p></p>

<p style="margin-left:2em;">para i = MAX-1 hasta i = tam <span
style="background-color:#ffff00">//ver decremento</span></p>

<p style="margin-left:4em">r.num[i] = a.num[i] + b.num[i] + acarreo</p>

<p style="margin-left:4em">acarreo = r.num[i] / 10 </p>

<p style="margin-left:4em">r.num[i] = r.num[i] mod 10</p>

<p></p>

<p style="margin-left:2em">Quitar ceros innecesarios a la izquierda del número
r</p>

<p></p>

<p style="margin-left:2em;">r.tam = MAX - tam</p>

<p></p>

<p><span style="background-color:#ffff00">Hacer explicación del pseudocódigo
con aclaraciones que sean necesarias</span></p>

<h2><strong>Sustracción</strong></h2>

<p>Se explica el algoritmo de la resta con su respectivo pseudocódigo.</p>

<p>SUSTRACCIÓN(<span style="background-color:#ffff00">ref</span> a,<span
style="background-color:#ffff00">ref</span> b, <span
style="background-color:#ffff00">ref</span> r):</p>

<p style="margin-left:2em;">tempb = b //variable temporal</p>

<p style="margin-left:2em;">Convertir tempb a complemento a 10</p>

<p style="margin-left:2em;">ADICIÓN(a,tempb, r)</p>

<p style="margin-left:2em;">r.num[MAX-a.tam-1] =0 <span
style="background-color:#ffff00">// ver el tema de los índices para el
pseudocodigo especialmente el "i-1" (usar rango 1 a n)</span></p>

<p style="margin-left:2em;">Quitar ceros innecesarios a la izquierda del
número r</p>

<p><span style="background-color:#ffff00">Hacer explicación del pseudocódigo
con aclaraciones que sean necesarias</span></p>

<h2><strong>Multiplicación</strong></h2>

<p>Se explica el algoritmo de la multiplicación con su respectivo
pseudocódigo.</p>

<h2><strong>División</strong></h2>

<p>Se explica el algoritmo de la división con su respectivo pseudocódigo
(divisor bigint y entero).</p>

<h2><strong>Módulo</strong></h2>

<p>Se explica como se realiza el módulo</p>

<h2>Algoritmo para obtener el entero largo.</h2>

<p>Como leer el número. (nose si es importante)</p>

<h2>Algoritmo para imprimir un entero largo.</h2>

<p>Pseudocódigo para mostrar el número.(nosé si es importante)</p>
</body>
</html>
